from django.urls import path, re_path

from . import views

urlpatterns = [
    # path('register/', views.register),
    # 注意:在给类视图注册子路由时,需要将类视图转成函数视图==>as_view()

    path('users/register/', views.RegisterView.as_view()),
    path('login/', views.LoginView.as_view(), name='login'),
    # 测试提取查询字符串参数：http://127.0.0.1:8000/querystr/?name=zxc&age=18
    path('querystring/', views.QueryString.as_view()),
    path('json/', views.JsonParamView.as_view()),
    path('url_param/<mobile:phone_num>/', views.UrlParam2View.as_view()),
    re_path(r'^url_param3/(?P<mobile_num>1[3-9]\d{9})/$', views.UrlParam3View.as_view()),
    path('from_data/', views.FromDataView.as_view()),
    path('json_str/', views.JsonView.as_view()),
    path('path/<str:name>/<int:age>/<email:Email>/', views.PathView.as_view()),
    path('json11/', views.ResponseJsonView.as_view()),
    path('redirect/', views.RedirectView.as_view()),
    path('index/', views.IndexView.as_view(),name='index'),
    path('login_redirect/', views.LoginRedirectView.as_view()),
    path('image/', views.ImageView.as_view())

]
'''
    as_view()底层原理
    核心内容
        1,将类视图转换成函数视图
        2,传递客户端发送的参数到视图内部
        3,进行请求分发

    1,讲类视图转成函数视图
    类视图调用as_view()****闭包****
         def as_view(cls, **initkwargs):
            def view(request, *args, **kwargs):
                pass
            return view
            
    2,传递客户端发送的参数到视图内部
        将类视图进行初始化
        cls:表示as_view()的调用者,也就是RegisterView
        self = cls(**initkwargs) 创建对象
        self 表示当前类视图对象
        
        self.setup(request, *args, **kwargs)
        
    3,进行请求分发
    self.dispatch(request, *args, **kwargs)
    
    
    def dispatch(self, request, *args, **kwargs):
    用于请求分发:
        获取当前请求方法的小写,并判断是否在可接收的请求方法列表中(变量后面带s,不是列表就是元组)
        if request.method.lower() in self.http_method_names:
            如果客户端的请求在可接收的范围内
            会取出当前类视图中,跟请求方法小写同名的函数
            如果当前的请求方法是GET.  request.method.lower() == get
            getattr() == get
            handler = get
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        
        调用被提取出来的get函数
        handler() 等价于 get()
        至此,类视图中,跟请求方法小写同名的函数就会被执行
        return handler(request, *args, **kwargs)
    
'''
